Google Container Engine (GKE) を触ってみた
この記事はこちらから転載したものです。
ども、大瀧です。 本日未明、Google社のイベントGCP Liveで新サービスのGoogle Container Engine(GKE)が発表されました。
GKEは、Googleを中心に開発されているDockerコンテナの管理ソフトウェアKubernetesのクラスタを簡単にデプロイできるサービスです。Dockerコンテナの実行にはGCE(Google Compute Engine)を利用します。現在はAlpha Releaseです(リリースポリシーはこのブログエントリーが詳しいです)。
既に実際に動かせるようになっていたので、コンテナをデプロイするまでを試してみた感想をレポートします。
クラスタの作成
GKEのドキュメントでは、全てCLI(gcloudユーティリティー)で説明されていますが、クラスタ作成はDevelopers Console画面から行うことができました。
Developer Consoleのメニューに[計算処理] - [Container Engine]という項目が増えているので、クリックし、[Create a cluster]ボタンで作成画面を表示します。
クラスタ名や配置するゾーン、マシンタイプなどを選択します。
画面の注意書きにも出ていますが、クラスタはマスターVM1台+ノードVM1台の計2台が最小構成で、[CLUSTER SIZE]で選択するのはマスターVMを除いたノードVM数になります。
以下のように、クラスタが作成されました。
ちなみに、各VMはGCEで実行されるので、メニューから[Compute Engine] - [VMインスタンス]を選択すると、GKEによって作成されたVMインスタンスを確認することもできます。インスタンス名の頭にあるk8sはKubernetesの略ですね。
Podの作成
クラスタを作成したらgcloudコマンドでPodを作成します。Podとは、Dockerコンテナをグループ化した単位です。Kubernetesでは、Podを始めとする各設定をあらかじめJSONファイルに記述し読み込んで利用します。今回はドキュメントのチュートリアルにあるguestbook.zipのJSONファイルを利用しました。
{ "apiVersion": "v1beta1", "kind": "Pod", "id": "redis-master-pod", "desiredState": { "manifest": { "version": "v1beta1", "id": "redis-master-pod", "containers": [{ "name": "redis-master", "image": "gurpartap/redis", "ports": [{ "name": "redis-server", "containerPort": 6379 }] }] } }, "labels": { "name": "redis", "role": "master" } }
このファイルをgcloud preview container pods createコマンドで読み込み、Podを作成します。
$ gcloud preview container pods create redis-master-pod --cluster-name=cluster1 --zone=asia-east1-a --config-file=redis-master-pod.json Fetching cluster endpoint and auth data. Waiting for cluster api initialization...done. Using gcloud compute copy-files to fetch ssl certs from cluster master... Updated [https://www.googleapis.com/compute/v1/projects/takipone-sandbox]. Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts. Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts. kubecfg.key 100% 1708 1.7KB/s 00:00 Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts. kubecfg.crt 100% 4347 4.3KB/s 00:00 Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts. ca.crt 100% 1159 1.1KB/s 00:00 ID Image(s) Host Labels Status ---------- ---------- ---------- ---------- ---------- redis-master-pod gurpartap/redis <unassigned> name=redis,role=master Waiting $
コマンドの出力結果から、Kubernetesの各設定ファイルをVMにSCPで転送し、有効化している様子が見えますね。少し待ち、gcloud preview container pods listコマンドでPodをリストします。
$ gcloud preview container pods list --cluster-name=cluster1 --zone asia-east1-a ID Image(s) Host Labels Status ---------- ---------- ---------- ---------- ---------- redis-master-pod gurpartap/redis k8s-cluster1-node-1.c.XXXXXXXXXX.internal/YY.YY.YY.YY name=redis,role=master Running
実行されていますね!
VMインスタンスの確認
今度は、gcloud compute sshでVMにSSH接続して様子を見てみます。まずはマスターVMに。
ryuta@k8s-cluster1-master:~$ ps ax : 5861 ? Sl 0:01 /usr/local/bin/etcd -peer-addr k8s-cluster1-master:7001 -name k8s-cluster1-master 5979 ? Sl 0:00 /usr/local/bin/apiserver -address=127.0.0.1 -machines=k8s-cluster1-node-1.c.takipone-sandbox.internal -etcd_ser 6062 ? Sl 0:00 /usr/local/bin/controller-manager -master=127.0.0.1:8080 6145 ? Sl 0:00 /usr/local/bin/scheduler --master=127.0.0.1:8080 -master=127.0.0.1:8080 6755 ? Ss 0:00 nginx: master process /usr/sbin/nginx 6756 ? S 0:00 nginx: worker process 6757 ? S 0:00 nginx: worker process 6758 ? S 0:00 nginx: worker process 6759 ? S 0:00 nginx: worker process :
マスターVMでは、Kubernetesの各プロセスが実行されています。コンテナで動作しているわけではないようですね。 続いて、ノードVMです。
ryuta@k8s-cluster1-node-1:~$ ps ax : 4968 ? Sl 0:04 /usr/bin/docker -d -p /var/run/docker.pid --bridge cbr0 --iptables=false --ip-masq=false -r=false 5065 ? Sl 0:01 /usr/local/bin/kubelet -etcd_servers=http://10.240.153.219:4001 -address=0.0.0.0 -config=/etc/kubernetes/manife 5147 ? Sl 0:01 /usr/local/bin/kube-proxy -etcd_servers=http://10.240.153.219:4001 :
こちらは、DockerとKubernetesのエージェントであるKubeletが動作していますね。 では、最後にdocker psで実行しているDockerコンテナを確認します。
ryuta@k8s-cluster1-node-1:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b1b752e80d7 gurpartap/redis:latest "/usr/local/bin/redi.." 7 minutes ago Up 7 minutes k8s_redis-master.8776a695_redis-master- pod.etcd_2db2de6c-6470-11e4-8135-42010af099db_c92d61a3 0366a5df1261 kubernetes/pause:go "/pause" 8 minutes ago Up 8 minutes k8s_net.645f884a_redis-master-pod.etcd_2db2de6c-6470-11e4-8135-42010af099db_1b1c83de ddb1d86698b8 google/cadvisor:0.5.0 "/usr/bin/cadvisor" 21 minutes ago Up 21 minutes k8s_cadvisor.417cd83c_cadvisor-agent.file_ca5ade9b cda608d5366b kubernetes/pause:go "/pause" 21 minutes ago Up 21 minutes 0.0.0.0:4194->8080/tcp k8s_net.f72d85c8_cadvisor-agent.file_fea895e4
KubernetesのJSONファイルの指定の通り、コンテナが実行されていますね!
感想とまとめ
触った感じとしては、勝手にVMが作成されてコンテナがデプロイされる様子がAWSのElastic Beanstalkに似ているなぁと思いました。 もちろんGKEの特徴はKubernetesサポートにあるので、BeanstalkのDocker環境よりも可用性やスケーラビリティの面でいろいろ機能があると思います。Kubernetesを勉強しつつ、使いこなしていきたいですね。
ちなみに、AWSのチーフエバンジェリストから以下のようなツイートが出ているので、来週にかけてAWSでもDockerについての動きがありそうですよ。乞うご期待!
Using #Docker and #AWS? You are in for a pleasant surprise at re:Invent!
— Jeff Barr (@jeffbarr) November 4, 2014